home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / dopus412-gpl / program / assembly.asm < prev    next >
Assembly Source File  |  2000-02-28  |  6KB  |  390 lines

  1. ; Directory Opus 4
  2. ; Original GPL release version 4.12
  3. ; Copyright 1993-2000 Jonathan Potter
  4. ; This program is free software; you can redistribute it and/or
  5. ; modify it under the terms of the GNU General Public License
  6. ; as published by the Free Software Foundation; either version 2
  7. ; of the License, or (at your option) any later version.
  8. ; This program is distributed in the hope that it will be useful,
  9. ; but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. ; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11. ; GNU General Public License for more details.
  12. ; You should have received a copy of the GNU General Public License
  13. ; along with this program; if not, write to the Free Software
  14. ; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  15. ; All users of Directory Opus 4 (including versions distributed
  16. ; under the GPL) are entitled to upgrade to the latest version of
  17. ; Directory Opus version 5 at a reduced price. Please see
  18. ; http://www.gpsoft.com.au for more information.
  19. ; The release of Directory Opus 4 under the GPL in NO WAY affects
  20. ; the existing commercial status of Directory Opus 5.
  21.  
  22. *    include "exec/types.i"
  23.     include "devices/inputevent.i"
  24.  
  25. *STRUCTURE RLEinfo,0
  26. *    APTR rle_sourceptr
  27. *    APTR rle_destplanes
  28. *    WORD rle_imagebpr
  29. *    WORD rle_imageheight
  30. *    WORD rle_imagedepth
  31. *    WORD rle_destbpr
  32. *    WORD rle_destheight
  33. *    WORD rle_destdepth
  34. *    BYTE rle_masking
  35. *    BYTE rle_compression
  36. *    LONG rle_offset
  37. *    LABLE rle_SIZEOF
  38.  
  39. _LVORawDoFmt equ -$20a
  40.  
  41. VIEW_FILE_SIZE       equ 0
  42. VIEW_MAX_LINE_LENGTH equ 4
  43. VIEW_TAB_SIZE        equ 8
  44. VIEW_TEXT_BUFFER     equ 12
  45.  
  46.     XREF _WorkbenchBase
  47.  
  48.     section code
  49.  
  50.     XDEF _lsprintf
  51.  
  52. _lsprintf:
  53.     movem.l a2/a3/a6,-(sp)
  54.     move.l 4*4(sp),a3
  55.     move.l 5*4(sp),a0
  56.     lea.l 6*4(sp),a1
  57.     lea.l stuffChar(pc),a2
  58.     move.l 4,a6
  59.     jsr _LVORawDoFmt(a6)
  60.     movem.l (sp)+,a2/a3/a6
  61.     rts
  62.  
  63. stuffChar:
  64.     move.b d0,(a3)+
  65.     rts
  66.  
  67.     XDEF _countlines
  68.  
  69. _countlines:
  70.     movem.l d2-d5/a2,-(sp) ; save registers
  71.  
  72.     move.l VIEW_FILE_SIZE(a0),d1
  73.     move.l VIEW_MAX_LINE_LENGTH(a0),d2
  74.     move.l VIEW_TEXT_BUFFER(a0),a0
  75.  
  76. * D1 = viewsize
  77. * D2 = maximum line length
  78. * A0 = buffer
  79. * ---
  80. * D0 = number of lines
  81. * D3 = number of characters counted
  82. * D5 = earliest position to wordwrap from
  83. * A1 = last white space character (for wordwrap)
  84.  
  85.     moveq #0,d0
  86.     moveq #0,d3
  87.     move.l d2,d5
  88.     sub.l #10,d5
  89.     move.l #0,a1
  90. loop:
  91.     addq #1,d3
  92.     cmp.l d2,d3
  93.     bne skip1
  94.     cmp.l #0,a1
  95.     beq nolastspace
  96.     move.l a0,a2    
  97.     sub.l a1,a2
  98.     cmp.l d5,a2
  99.     bge nolastspace
  100.     add.l a2,d1
  101.     move.l a1,a0
  102. nolastspace:
  103.     move.b #10,(a0)
  104.     addq #1,d0
  105.     moveq #0,d3
  106.     sub.l a1,a1
  107.     bra skip3
  108. skip1:
  109.     cmpi.b #10,(a0)
  110.     bne skip2
  111.     sub.l a1,a1
  112.     addq #1,d0
  113.     moveq #0,d3
  114.     bra skip3
  115. skip2:
  116.     cmpi.b #9,(a0)
  117.     bne skip3
  118.     move.b #32,(a0)
  119. skip3:
  120.     cmpi.b #32,(a0)
  121.     bne notspace
  122.     move.l a0,a1
  123. notspace:
  124.     subq.l #1,d1
  125.     cmpi.l #0,d1
  126.     beq endcountlines
  127.     addq.l #1,a0
  128.     bra loop
  129. endcountlines:
  130.     cmpi.b #10,(a0)
  131.     beq lastlf
  132.     addq #1,d0
  133. lastlf:
  134.     movem.l (sp)+,d2-d5/a2
  135.     rts
  136.  
  137.     XDEF _smartcountlines
  138.  
  139. _smartcountlines:
  140.     movem.l d2-d7/a2,-(sp)
  141.  
  142.     move.l VIEW_FILE_SIZE(a0),d1
  143.     move.l d1,d7
  144.     move.l VIEW_MAX_LINE_LENGTH(a0),d2
  145.     move.l VIEW_TEXT_BUFFER(a0),a0
  146.  
  147.     moveq #0,d0
  148.     moveq #0,d3
  149.     moveq #0,d4
  150.     move.l d2,d5
  151.     sub.l #10,d5
  152.     moveq #0,d6
  153.     move.l #0,a1
  154. aloop:
  155.     addq #1,d3
  156.     cmp.l d2,d3
  157.     bne askip1
  158.     cmp.l #0,a1
  159.     beq nolastspace1
  160.     move.l a0,a2    
  161.     sub.l a1,a2
  162.     cmp.l d5,a2
  163.     bge nolastspace1
  164.     add.l a2,d1
  165.     move.l a1,a0
  166. nolastspace1:
  167.     move.b #10,(a0)
  168.     sub.l a1,a1
  169.     addq #1,d0
  170.     moveq #0,d3
  171.     bra askip2
  172. askip1:
  173.     cmpi.b #-33,(a0)
  174.     blt aokay
  175.     cmpi.b #-1,(a0)
  176.     ble aishex
  177.     cmpi.b #9,(a0)
  178.     blt aishex
  179.     cmpi.b #14,(a0)
  180.     blt aokay
  181.     cmpi.b #32,(a0)
  182.     blt aishex
  183.     cmpi.b #128,(a0)
  184.     blt aokay
  185.     cmpi.b #160,(a0)
  186.     bge aokay
  187. aishex:
  188.     cmpi.l #6,d7
  189.     blt nomorecheck
  190.     addq #1,d4
  191.     cmpi.l #6,d4
  192.     bge nomorecheck
  193.     cmpi.b #27,(a0)
  194.     bne aokay1
  195.     moveq #1,d6
  196.     bra aokay1
  197. nomorecheck:
  198.     move.l #-1,d0
  199.     movem.l (sp)+,d2-d7/a2
  200.     rts
  201. aokay:
  202.     moveq #0,d4
  203.     cmpi.b #1,d6
  204.     bne aokay1
  205.     cmpi.b #'[',(a0)
  206.     beq isansi
  207.     moveq #0,d6
  208.     bra aokay1
  209. isansi:
  210.     move.l #-2,d0
  211.     movem.l (sp)+,d2-d7/a2
  212.     rts
  213. aokay1:
  214.     cmpi.b #10,(a0)
  215.     bne askip2
  216.     sub.l a1,a1
  217.     addq #1,d0
  218.     moveq #0,d3
  219. askip2:
  220.     cmpi.b #32,(a0)
  221.     bne notspace1
  222.     move.l a0,a1
  223. notspace1:
  224.     subq.l #1,d1
  225.     cmpi.l #0,d1
  226.     beq endsmartcount
  227.     addq.l #1,a0
  228.     bra aloop
  229. endsmartcount:
  230.     cmpi.b #10,(a0)
  231.     beq lastlf1
  232.     addq #1,d0
  233. lastlf1:
  234.     movem.l (sp)+,d2-d7/a2
  235.     rts
  236.  
  237.     XDEF _ansicountlines
  238.  
  239. tabsize:
  240.     dc.l 0
  241.  
  242. _ansicountlines:
  243.     movem.l d2-d7/a2,-(sp)
  244.  
  245.     move.l VIEW_TAB_SIZE(a0),d0
  246.     move.l d0,tabsize
  247.     move.l VIEW_FILE_SIZE(a0),d1
  248.     move.l VIEW_MAX_LINE_LENGTH(a0),d2
  249.     move.l VIEW_TEXT_BUFFER(a0),a0
  250.  
  251.     moveq #0,d0
  252.     moveq #0,d3
  253.     move.l d2,d5
  254.     sub.l #10,d5
  255.     moveq #0,d6
  256.     move.l tabsize,d7
  257.     move.l #0,a1
  258.  
  259. nloop:
  260.     cmpi.b #32,(a0)
  261.     bge notillegal
  262.     cmpi.b #0,(a0)
  263.     blt notillegal
  264.     cmpi.b #9,(a0)
  265.     beq notillegal
  266.     cmpi.b #10,(a0)
  267.     beq notillegal
  268.     cmpi.b #27,(a0)
  269.     beq notillegal
  270.  
  271.     move.b #' ',(a0)
  272.     bra nottab
  273.  
  274. notillegal:
  275.     cmpi.b #27,(a0)
  276.     bne notescape
  277.     moveq #1,d6
  278.     bra nnotspace
  279. notescape:
  280.     cmpi.b #1,d6
  281.     bne notansi
  282.     cmpi.b #';',(a0)
  283.     beq nnotspace
  284.     cmpi.b #'[',(a0)
  285.     beq nnotspace
  286.     cmpi.b #'0',(a0)
  287.     blt endansi
  288.     cmpi.b #'9',(a0)
  289.     ble nnotspace
  290. endansi:
  291.     moveq #0,d6
  292.     bra nnotspace
  293.  
  294. notansi:
  295.     cmpi.b #9,(a0)
  296.     bne nottab
  297.     add.l d7,d3
  298.     move.l tabsize,d7
  299.     bra notnexttab
  300. nottab:
  301.     addq #1,d3
  302.     subq #1,d7
  303.     cmpi.b #0,d7
  304.     bgt notnexttab
  305.     move.l tabsize,d7
  306. notnexttab:
  307.     cmp.l d2,d3
  308.     blt nskip1
  309.     cmp.l #0,a1
  310.     beq nnolastspace
  311.     move.l a0,a2    
  312.     sub.l a1,a2
  313.     cmp.l d5,a2
  314.     bge nnolastspace
  315.     add.l a2,d1
  316.     move.l a1,a0
  317. nnolastspace:
  318.     move.b #10,(a0)
  319.     addq #1,d0
  320.     moveq #0,d3
  321.     moveq #0,d6
  322.     move.l tabsize,d7
  323.     sub.l a1,a1
  324.     bra nskip2
  325. nskip1:
  326.     cmpi.b #10,(a0)
  327.     bne nskip2
  328.     sub.l a1,a1
  329.     addq #1,d0
  330.     moveq #0,d3
  331.     moveq #0,d6
  332.     move.l tabsize,d7
  333. nskip2:
  334.     cmpi.b #32,(a0)
  335.     beq isspace
  336.     cmpi.b #9,(a0)
  337.     bne nnotspace
  338. isspace:
  339.     move.l a0,a1
  340. nnotspace:
  341.     addq.l #1,a0
  342.     subq.l #1,d1
  343.     cmpi.l #0,d1
  344.     bgt nloop
  345.     movem.l (sp)+,d2-d7/a2
  346.     rts
  347.  
  348.     XDEF _removetabs
  349.  
  350. _removetabs:
  351.     move.l VIEW_FILE_SIZE(a0),d1
  352.     move.l VIEW_TEXT_BUFFER(a0),a0
  353.  
  354.     moveq #0,d0
  355. rloop:
  356.     cmpi.b #9,(a0)
  357.     bne rskip
  358.     move.b #' ',(a0)
  359. rskip:
  360.     addq.l #1,a0
  361.     subq.l #1,d1
  362.     cmpi.l #0,d1
  363.     bgt rloop
  364.     rts
  365.  
  366.     XDEF _filteroff
  367.  
  368. _filteroff:
  369.     btst.b #1,$bfe001
  370.     bne alreadyon
  371.     bset.b #1,$bfe001
  372.     moveq.l #1,d0
  373.     rts
  374. alreadyon:
  375.     moveq.l #0,d0
  376.     rts
  377.  
  378.     XDEF _filteron
  379.  
  380. _filteron:
  381.     bclr.b #1,$bfe001
  382.     rts
  383.  
  384.     end
  385.